﻿#ifndef LK_COLLECTION_MESSAGEPACK_
#ifdef LK_COLLECTION_BUFFER_
#define LK_COLLECTION_MESSAGEPACK_
namespace LK
{
	namespace Collection
	{
		typedef ptr<Collection::DefaultMessageBuffer>PDefaultMessageBuffer;
		typedef ptr<Collection::MessagePack>PMessagePack;
		/**
		@brief 表示一个消息包*/
		struct MessagePack :Object {
			IMETHODS(PMessagePack, MessagePack);
			//序号
			u64 Number;
			//内容
			PByteArray data;
			//构造函数
			MessagePack(u64 num, PByteArray dat);
		};
		/**@brief
		表示一个默认的字节缓存块。封送时，消息由内容长度(包含长度验证码)、验证号、序号、内容、随机数五部分组成*/
		struct DefaultMessageBuffer :LK::Object{
			IMETHODS(PDefaultMessageBuffer, DefaultMessageBuffer)
			/**
			@brief 消息缓存*/
			Buffer buffer;
			/**
			@brief 将指定的数据打包进缓存块*/
			void PackToBuffer(void* p, u32 len, PTime const& timeout = Buffer::DefaultTimeOut);
			/**
			@brief 返回一个存储Message的对象*/
			PMessagePack ReadMessage(PTime const& timeout = Buffer::DefaultTimeOut);
			/**
			@brief 使用一个序号和最大长度进行初始化*/
			DefaultMessageBuffer(u64 num = 0, u32 maxlen = DefaultMaxLength);
			/**
			@brief 默认最大内容长度限制：1MB*/
			static u32 DefaultMaxLength;
		private:
			/**
			@brief 长度限制*/
			u32 maxLength;
			/**
			@brief 当前写入自增序号*/
			u64 inNumber;
			/**
			@brief 当前读取自增序号*/
			u64 outNumber;
		};
	}
}

#endif
#endif